/*
Nombre de la clase: Announcement_Controller
Autor: Elias Almanza Laguna
Objetivo de la clase: Proporcionar los metodos relacionados 
                        con el manejo de información de los
                        comunicados (Announcement__c) en el
                        portal del usuario estandar (Recursos
                        Humanos). En el portal del usuario
                        estandar se pueden ver y modificar
                        todos los comunicados de todos los
                        empleados. 
*/
global class Announcement_Controller {

    
    
    public Announcement__c Ann_New;

    public Announcement__c getAnn_New(){
        if(Ann_New==null)
        Ann_New = new Announcement__c();
        return Ann_New;
    }
    
    public Field_Container__c getfieldContainer(){
        if(fieldContainer==null)
        fieldContainer = new Field_Container__c();
        return fieldContainer;
    }
    
    public Field_Container__c fieldContainer{get;set;}
    
    
  
    private Announcement_Controller stdCtrl {get; set;} 
    
    private Id accountId;
    
    public String Ann_Id{get;set;}
    public String ATask_Id{get;set;}
       
    public String returnurl{get;set;}
    public String filtro {get;set;}
    public Date Date1 {get;set;}
    public Date Date2 {get;set;}
    public String Date1str {get;set;}
    public String Date2str {get;set;}
    
    public String tempPageRef {get; set;}
    
    private Id myUserId;
    private List<A_Task_User__c> tsk_u;
    private List<Id> ids;
    public List<Announcement__c> Ann_edit{get; set;}
    public List<A_Task__c> Atask_edit{get; set;}
    public List< A_Task_User__c> a_task_users_list{get; set;}    
    
    public List<Announcement__c> announcements_list{get;set;}
    public List<A_Task__c> a_task_list{get;set;}
      
    /*
     *** Constructor de la clase ***
       - Se asigna el filtro a "All" para desplegar todas
            las tareas sin importar el estatus de la tarea.
       - Creamos la instancia de 'fieldContainer' el cual 
           es un objeto del que usamos 2 campos tipo Date
           para filtro de fechas en el despliegue de la
           lista de tareas.
    */
    public Announcement_Controller(){
        filtro = 'All';
        verifyParameters();
        fieldContainer=new Field_Container__c();
    }
    
    /*
    *** Method SendEmailWithTemplate() ***
    - Objetivo: Método que es un Webservice para llamar a otro
                método en la clase OutboundEmails. Para llamar a
                la función 'OutboundEmails.SendEmailWithTemplate()'
                primero recupera un parametro de su pagina web
                actual. La función OutboundEmails.SendEmailWithTemplate()
                enviara un email a los involucrados en el Announcement
                que tiene un Id igual al parametro enviado.
    */
    static WebService void SendEmailWithTemplate() {
    PageReference pageAnn = Page.Ann_edit;
    String annIdPara = ApexPages.currentPage().getParameters().get('annIdPara');    
    OutboundEmails.SendEmailWithTemplate(annIdPara);
    }
    
    /*
    *** Method verifyParameters() ***
    - Objetivo: Método que verifica si existen el parámetro
                'paramAnn_Id' en la pagina actual. Si existe
                ese parámetro entonces lo recupera y cambia
                el valor de 'tempPageRef' la cual es una 
                variable que guarda el valor de una página
                dinámica asignándole el valor de 'Ann_Edit'.
                'Ann_Edit' es una pagina para desplegar un sólo
                comunicado (Announcement__c). El Announcement
                que despliega 'Ann_Edit' lo toma de la varible
                'Ann_Id'. Sino existe en la página actual el
                parámetro 'paramAnn_Id' entonces la página
                dinámica contenida en la variable 'tempPageRef'
                se le asigna el valor de 'Announcements_List'.
                'Announcements_List' es una página con el 
                diseño para desplegar varios comunicados
                (Announcement__c).
    */
    public PageReference verifyParameters() {
           if (ApexPages.currentPage().getParameters().containsKey('paramAnn_Id')){
               Ann_Id = ApexPages.currentPage().getParameters().get('paramAnn_Id');
               tempPageRef = 'Ann_Edit';
           }else tempPageRef = 'Announcements_List';  
            return null;
    }
    
 
    /*
    *** Method getAnns_List() ***
    - Objetivo: Método para realizar una consulta del objeto Announcement__c,
               es decir, los comunicados. La consulta utiliza un filtro de
               estatus y de un rango de fechas del comunicado y se guarda en
               el objeto 'announcements_list'. Este método se ejecuta 
               automáticamente al abrir la página 'Announcements_List'.
    */
    public void getAnns_List(){
        if (filtro == 'All') {                              
            announcements_list = [SELECT Id, Name, Status__c, Start_Date__c FROM Announcement__c WHERE ( Start_Date__c>=:fieldContainer.Start_Date__c AND Start_Date__c<=:fieldContainer.End_Date__c )];
        } else {
            announcements_list = [SELECT Id, Name, Status__c, Start_Date__c FROM Announcement__c WHERE  (Status__c=:filtro) AND ( Start_Date__c>=:fieldContainer.Start_Date__c AND Start_Date__c<=:fieldContainer.End_Date__c ) ];
        }   
    }      
    
    /*
    *** Method openAnnouncement() ***
    - Objetivo: Método para realizar la consulta de un registro del objeto
                Announcement__c, que sea igual a la variable Ann_Id. Después
                de obtener los datos de comunicado realiza la consulta de las
                tareas relacionadas a ese comunicado. Este procedimiento se
                ejecuta automáticamente cuando se carga la pagina 'Ann_Edit',
                es decir, la página que despliega un solo de registro de 
                Announcement__c en modo edición.
    */
    public PageReference openAnnouncement() {
        Ann_edit = [SELECT Id, Name, Start_Date__c,Status__c FROM Announcement__c WHERE Id=:Ann_Id LIMIT 1];  
        Set<Id> ids_announcement = new Set<Id>();
        for(Announcement__c announcement : Ann_edit){    
            ids_announcement.add(announcement.Id); 
            }
        a_task_list = [SELECT Status__c, Name, Id, Due_Date__c, Description__c, URL__c FROM A_Task__c WHERE Announcement__c IN :ids_announcement ];
        return null;
    }
             
    
    /*
    *** Method processRequests() ***
    - Objetivo: Método para realizar una consulta del objeto Announcement__c,
               es decir, los comunicados. La consulta utiliza un filtro de
               estatus y de un rango de fechas del comunicado.
    
    - Objetivo: Método para realizar una consulta del objeto Announcement__c,
               es decir, los comunicados. La consulta se guarda en el objeto
               'announcements_list'. Este método tiene la misma
               función que 'getAnns_List()' pero 'processRequests()' se
               ejecuta cuando se realiza un cambio en el filtro de estatus
               o fechas.
    */
    public PageReference processRequests(){ 
        if (filtro == 'All') {
            announcements_list = [SELECT Id, Name, Status__c, Start_Date__c FROM Announcement__c WHERE ( Start_Date__c>=:fieldContainer.Start_Date__c AND Start_Date__c<=:fieldContainer.End_Date__c )];
        } else {
            announcements_list = [SELECT Id, Name, Status__c, Start_Date__c FROM Announcement__c WHERE  (Status__c=:filtro) AND ( Start_Date__c>=:fieldContainer.Start_Date__c AND Start_Date__c<=:fieldContainer.End_Date__c )];
        }   
        return null;
    }
      

   /*
   *** Method save() ***
    - Objetivo: Método para guardar los cambios en los registros mostrados
               a través del objeto 'announcements_list'.
   */
   public PageReference save() {
       IF (announcements_list!=null){
           update announcements_list;
       }
       return null;
    }
    
    public PageReference cancel() {
        return null;
    }
    
    /*
    *** Method save_announcement() ***
    - Objetivo: Método para guardar los cambios en un registro mostrado
               a través del objeto 'Ann_edit'. Despues de guardar el
               registro, este método redirecciona la pagina hacia la
               página principal de los comunicados '/apex/Announcements'
               en la la cual se muestra la lista general de los 
               comunicados.
    */
    public PageReference save_announcement() {
       IF (Ann_edit!=null){
           update Ann_edit;
       }
      PageReference redirect = new PageReference('/apex/Announcements');   
        redirect.setRedirect(true); 
        return redirect;
    }
    
   
    /*
    *** Method save_new_announcement() ***
    - Objetivo: Método para guardar un registro nuevo de Announcement__c.
                Este nuevo registro de comunicado al insertarse genera un
                nuevo Id de Announcement__c el cual se guarda en la
                variable 'Ann_Id'. Luego de guardarse se cambia la pagina de 
                'Ann_New' por la página 'Ann_Edit' la cual consultará un solo
                registro de Announcement__c que coincida con la variable 
                'Ann_Id'.
    */
    public PageReference save_new_announcement() {
       IF (Ann_New!=null){
           insert Ann_New;
           Ann_Id=Ann_New.Id;
           tempPageRef = 'Ann_Edit';
       }
       PageReference redirect = new PageReference('/apex/Announcements');   
        redirect.setRedirect(true); 
        return redirect;
    }
        
    /*
    *** Method Announcement_Open() ***
    - Objetivo: Método que cambia la pagina actual por la página
                'Ann_Edit' la cual se utiliza para desplegar un
                solo registro del objeto Announcement__c.
    */
    public PageReference Announcement_Open() {
    tempPageRef = 'Ann_Edit';
        return null;
    }
    
   
    /*
    *** Method Announcement_Delete() ***
    - Objetivo: Método que elimina el registro de los comunicados
                (Announcement__c) que coincida su 'Id' con la
                variable 'Ann_Id'. Antes de borrar el comunicado
                primero elimina las tareas relacionadas a ese
                comunicado. Luego del proceso de eliminación,
                hace un refrescamiento de la pagina principal de
                los comunicados ('/apex/Announcements') para
                visualizar de nuevo la lista ahora sin el registro
                eliminado.
    */
    public PageReference Announcement_Delete() {
        List<A_Task__c> Atask_list = [SELECT Id, Name FROM A_Task__c WHERE Announcement__c =:Ann_Id];
        for(A_Task__c aTask : Atask_list){
            Delete aTask; 
        }
        announcements_list = [SELECT Id FROM Announcement__c WHERE Id = :Ann_Id];
        for(Announcement__c Ann_Current : announcements_list){    
            Delete Ann_Current; 
        }
        PageReference redirect = new PageReference('/apex/Announcements');   
        redirect.setRedirect(true); 
        return redirect;
    }

    /*
    *** Method Atask_Open() ***
    - Objetivo: Método que redireecciona la página 'Ann_Edit'
                (pagina de edición de comunicado) por la página
                '/apex/AnnouncementTasks' (página de tareas de 
                comunicado, la cual usa otro controlador). Antes
                de abrir la nueva página de tareas de comunicado
                se guarda el 'Id' de la tarea seleccionada (contenida
                en la variable 'Atask_Id') y se pasa al parametro
                'paramAtask_id'. 
    */
    public PageReference Atask_Open() {
        PageReference redirect = new PageReference('/apex/AnnouncementTasks'); 
        redirect.getParameters().put('paramAtask_id',Atask_Id); 
        redirect.setRedirect(true); 
        return redirect;
    }
    
    /*
    *** Method Announcement_New() ***
    - Objetivo: Método que redireecciona a la página 'Ann_New'
                (pagina de creación de comunicado). 
    */
    public PageReference Announcement_New() {
        tempPageRef = 'Ann_New';
        return null;
    }
    
    /*
    *** Method  Atask_New() ***
    - Objetivo: Método que redireecciona la pagina actual 'Ann_Edit'
                a la página '/apex/AnnouncementTasks' (página de tareas
                de comunicado). Al tiempo que se redirecciona se le agrega
                un parametro a esa nueva direccion URL. El parametro 
                'paramAnn_id' y toma el valor de la variable 'Ann_Id' la
                cual contiene el 'Id' del comunicado actualmente en edición
                y al cual se le quiere agregar una tarea. Cuando se ejecuta
                este método se abandona este controlador y usará entonces
                el controlador para tareas de comunicado 'Ann_Tsk_Std_Cntlr'.
    */
    public PageReference Atask_New() {
        PageReference redirect = new PageReference('/apex/AnnouncementTasks'); 
        redirect.getParameters().put('paramAnn_id',Ann_Id); 
        redirect.setRedirect(true); 
        return redirect;
    }
    
    public PageReference gotoAnnouncements() {
            PageReference redirect = new PageReference('/apex/Announcements'); 
            redirect.setRedirect(true); 
            return redirect;
    }


}